package com.chenfwind.utils;

/** 
 * 文件名：StringUtils.java
 * @author  金洪飞
 * @最后修改人： 金洪飞 
 * @最后修改日期：	2015-1-4 下午2:23:16
 * @version2.0
 * Copyright 珠海市恒源信息技术有限公司 Corporation 2015
 */



import java.nio.ByteBuffer;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

import javax.servlet.http.HttpServletRequest;

import com.chenfwind.common.Constant;


/**
 * 类描述：
 * 
 * @author 金洪飞
 * @最后修改人： 金洪飞
 * @最后修改日期： 2015-1-4 下午2:23:16
 * @version 0.3
 */

public class StringUtils {
	public static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";

	public static boolean isNull(Object obj) {
		if (obj != null)
			obj = obj.toString().trim();
		return obj == null || "".equals(obj) || "NULL".equals(obj) || "null".equals(obj);
	}

	/**
	 * 
	 * genUUID 方法描述：生成uuid.
	 * 
	 * @author 金洪飞
	 * @最后修改人： 金洪飞
	 * @最后修改日期： 2015-3-19 上午10:25:25
	 * @version 0.3
	 * 
	 * @return String
	 */
	public static String genUUID() throws RuntimeException {
		UUID id = UUID.randomUUID();
		ByteBuffer bf = ByteBuffer.allocate(16);
		bf.putLong(id.getLeastSignificantBits());
		bf.putLong(id.getMostSignificantBits());
		byte[] b = bf.array();
		MessageDigest md5;
		try {
			md5 = MessageDigest.getInstance("MD5");
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
		b = md5.digest(b);
		return ByteUtils.byteArray2String(b).substring(0, 24);
	}

	/**
	 * 
	 * time2int 方法描述：h:m:s.SSS格式的时间转换为微秒 例子：0:00:05.000 = 5000毫秒
	 * 
	 * @author 金洪飞
	 * @最后修改人： 金洪飞
	 * @最后修改日期： 2015-3-25 上午9:32:38
	 * @version 0.3
	 * 
	 * @param stringTime
	 * @return Integer
	 */
	public static Integer time2int(String stringTime) {
		int pos = -1;
		pos = stringTime.indexOf(":");
		if (pos < 0) {
			return 0;
		}
		String[] str = stringTime.split(":");
		if (str.length != 3) {
			return 0;
		}
		int hour = Integer.parseInt(str[0]);
		int minute = Integer.parseInt(str[1]);
		String secondString = str[2];
		String[] mSecondArray = secondString.split("\\.");
		int second = Integer.parseInt(mSecondArray[0]);

		String mSecString = mSecondArray[1];
		int mSecond = (int) ((Integer.parseInt(mSecString) / (Math.pow(10, mSecString.length()))) * 1000);
		return hour * 60 * 60 * 1000 + minute * 60 * 1000 + second * 1000 + mSecond;
	}

	/**
	 * 
	 * int2time 方法描述：为上一个函数的逆函数，将整型的微秒时间转换为时分秒微秒字符串，格式h:m:s.SSS
	 * 
	 * @author 金洪飞
	 * @最后修改人： 金洪飞
	 * @最后修改日期： 2015-5-25 下午5:23:32
	 * @version 0.3
	 * 
	 * @param time
	 * @return
	 * @return String
	 */
	public static String int2time(Integer time) {
		String timeString = null;
		if (time > 0) {
			long hour = time / (60 * 60 * 1000);
			long minute = (time - hour * 60 * 60 * 1000) / (60 * 1000);
			long second = (time - hour * 60 * 60 * 1000 - minute * 60 * 1000) / 1000;
			long mSecond = time - hour * 60 * 60 * 1000 - minute * 60 * 1000 - second * 1000;
			timeString = String.format("%d:%d:%d.%d", hour, minute, second, mSecond);
			if (timeString.contains(".")) {
				timeString = timeString.substring(0, timeString.indexOf("."));
			}
		}
		return timeString;
	}

	public static String int2fulltime(Integer time) {
		String timeString = null;
		if (time > 0) {
			long hour = time / (60 * 60 * 1000);
			long minute = (time - hour * 60 * 60 * 1000) / (60 * 1000);
			long second = (time - hour * 60 * 60 * 1000 - minute * 60 * 1000) / 1000;
			// long mSecond = time - hour * 60 * 60 * 1000 - minute * 60 * 1000 - second * 1000;
			timeString = String.format("%02d:%02d:%02d", hour, minute, second);

		}
		return timeString;
	}

	/**
	 * 
	 * bytesToHexString 方法描述：字节数组转换十六进制字符串
	 * 
	 * @author 金洪飞
	 * @最后修改人： 金洪飞
	 * @最后修改日期： 2015-3-25 上午9:32:13
	 * @version 0.3
	 * 
	 * @param src
	 * @return String
	 */
	public static String bytesToHexString(byte[] src) {
		StringBuilder stringBuilder = new StringBuilder("");
		if (src == null || src.length <= 0) {
			return null;
		}
		for (int i = 0; i < src.length; i++) {
			int v = src[i] & 0xFF;
			String hv = Integer.toHexString(v);
			if (hv.length() < 2) {
				stringBuilder.append(0);
			}
			stringBuilder.append(hv);
		}
		return stringBuilder.toString();
	}

	/**
	 * 
	 * isNumeric 方法描述：判断字符串是否为数字
	 * 
	 * @author 金洪飞
	 * @最后修改人： 金洪飞
	 * @最后修改日期： 2015-4-21 下午4:37:33
	 * @version 0.3
	 * 
	 * @param str
	 * @return boolean
	 */
	public static boolean isNumeric(String str) {
		for (int i = str.length(); --i >= 0;) {
			if (!Character.isDigit(str.charAt(i))) {
				return false;
			}
		}
		return true;
	}

	/**
	 * 
	 * getURLPrefix 方法描述：通过request获取url前缀(服务端)。
	 * 
	 * @author 金洪飞
	 * @最后修改人： 金洪飞
	 * @最后修改日期： 2015-5-5 下午5:28:50
	 * @version 0.3
	 * 
	 * @param request
	 * @return String
	 */
	public static String getUrlPrefixOfInterface(HttpServletRequest request) {
		if (request == null) {
			return "";
		}
		return "http://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath();
	}

	/**
	 * 
	 * getURLPrefix 方法描述：通过request获取url前缀（运营端）。
	 * 
	 * @author 金洪飞
	 * @最后修改人： 金洪飞
	 * @最后修改日期： 2015-5-5 下午5:28:50
	 * @version 0.3
	 * 
	 * @param request
	 * @return String
	 */
	public static String getUrlPrefixOfPlatform(HttpServletRequest request) {
		if (request == null) {
			return "";
		}
		return "https://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath();
	}

	

	/**
	 * 
	 * makeStatusName 方法描述：根据status获取状态名称
	 * 
	 * @author 金洪飞
	 * @最后修改人： 金洪飞
	 * @最后修改日期： 2015-5-20 下午5:32:33
	 * @version 0.3
	 * 
	 * @param status
	 * @return String
	 */
	public static String makeStatusName(Integer status) {
		if (status == null) {
			return null;
		}
		if (Constant.STATUS_ON.equals(status)) {
			return Constant.STATUS_NAME_ON;
		}
		if (Constant.STATUS_OFF.equals(status)) {
			return Constant.STATUS_NAME_OFF;
		}

		return null;
	}






	/**
	 * 
	 * findLastSlash 方法描述：查找最后一个斜杠（Linux）或反斜杠（Windows）
	 * 
	 * @author 金洪飞
	 * @最后修改人： 金洪飞
	 * @最后修改日期： 2015-5-29 上午11:06:35
	 * @version 0.3
	 * 
	 * @param source
	 * @return int
	 */
	public static int findLastSlash(String source) {
		int pos = 0;
		if (isNull(source)) {
			return pos;
		}
		pos = source.lastIndexOf("\\");
		if (pos <= 0) {
			pos = source.lastIndexOf("/");
		}
		if (pos <= 0) {
			return source.length();
		}
		return pos;
	}

	public static String formatDateTime(Date dateTime) {
		return formatDateTime(dateTime, DATE_FORMAT);
	}

	public static String formatDateTime(Date dateTime, String dateFormat) {
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat(dateFormat);
		return simpleDateFormat.format(dateTime);
	}

	public static Date string2Date(String dateStr) {
		try {
			SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DATE_FORMAT);
			return simpleDateFormat.parse(dateStr);
		} catch (ParseException e) {
			e.printStackTrace();
			throw new RuntimeException(Constant.MSG_DATE_FORMAT_EXCEPTION);
		}
	}

	public static void main(String[] args) {
		// System.out.println("01:18:10.226:" + time2int("01:18:10.226"));// 4690226
		// System.out.println("4690226:" + int2time(4690226));
		// System.out.println(formatDateTime(new Date()));
		// System.out.println(string2Date("2015-10-11 23:59:59"));
		// System.out.println(time2int("10:06:34.000226"));
		System.out.println(new Date());
		// System.out.printf(formatDateTime(new Date(),HYConstant.DATATIME_FORMAT_LONG));
		// for (int i = 0; i < 4846; i++) {
		// System.out.print(genUUID()+",");
		// }
	}

	private final static String[] hexDigits = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F" };

	private static String byteToHexString(byte b) {
		int n = b;
		if (n < 0)
			n = 256 + n;
		int d1 = n / 16;
		int d2 = n % 16;
		return hexDigits[d1] + hexDigits[d2];
	}

	/**
	 * 
	 * MD5Encode 方法描述：md5加密字符串
	 * 
	 * @author 金洪飞
	 * @最后修改人： 金洪飞
	 * @最后修改日期： 2015-6-17 下午3:01:53
	 * @version 0.3
	 * 
	 * @param origin
	 * @return
	 * @return String
	 */
	public static String MD5Encode(String origin) {
		String resultString = null;
		try {
			resultString = new String(origin);
			MessageDigest md = MessageDigest.getInstance("MD5");
			resultString = byteArrayToHexString(md.digest(resultString.getBytes()));
		} catch (Exception ex) {
		}
		return resultString;
	}

	/**
	 * 转换字节数组为16进制字串
	 * 
	 * @param b
	 *            字节数组
	 * @return 16进制字串
	 */
	public static String byteArrayToHexString(byte[] b) {
		StringBuffer resultSb = new StringBuffer();
		for (int i = 0; i < b.length; i++) {
			resultSb.append(byteToHexString(b[i]));
		}
		return resultSb.toString();
	}
}
